使用Nodejs的USB至RS485

您所在的位置:网站首页 node serial port examples 使用Nodejs的USB至RS485

使用Nodejs的USB至RS485

2022-07-31 16:07| 来源: 网络整理| 查看: 265

我試圖通過USB至RS485接口(半雙工USB485)與計算機(Linux 16.04)從真空計(前一型號https://www.pfeiffer-vacuum.com/en/products/measurement/digiline/gauges/?detailPdoId=13238&request_locale=en_US)接收和發送數據-STISO從http://www.hjelmslund.dk/)。當我使用特定的協議向儀表發送請求時,它應該回答請求,我應該能夠通過接口接收它。我設法發送數據,但每當我發送數據時,似乎什麼都沒有回來。我試圖用Node.js來做到這一點。我迄今使用的代碼是:使用Nodejs的USB至RS485

function pack(address, action, parameter, data) { var length = String('00' + data.length.toString()).slice(-2); var bufferAsString = address + action + parameter + length + data; var check = 0; for (var i = 0; i < bufferAsString.length; ++i) { check += bufferAsString.charCodeAt(i) } var checkSum = String('000' + String(check % 256)).slice(-3); var buffer = Buffer.from(bufferAsString + checkSum), carriageReturn = Buffer.from('\r'); return Buffer.concat([buffer, carriageReturn]); } var serialPort = require('serialport'); var SerialPort = serialPort.SerialPort; var port = new SerialPort('/dev/ttyUSB0', { baudrate: 9600, dataBits: 8, stopBits: 1, parity: 'none' }, false); port.open(function(err) { if (err) { return console.log('Error opening port: ', err.message); } console.log(port.isOpen()); port.on('data', function (data) { console.log('Data: ' + data); }); port.on('close', function() { console.log('port closed') }); var sendBuffer = pack('001', '00', '740', '=?'); setInterval(function() { port.write(sendBuffer, function(err, bytes) { console.log('send' + bytes) }); port.drain(); }, 1000) });

這應該是每隔一秒鐘向量表發送一個請求來測量壓力。我知道該請求正在發送,因爲TxD-Led每秒都會閃爍。但我沒有收到這個請求的答覆。 我也嘗試了其他發送數據的方法(主要是通過python和終端),但也取得了相似的成功。發送的綠燈始終閃爍但沒有任何反應,也沒有收到應答。 我很遺憾接下來要嘗試什麼,並且非常感謝您可以給我提供的任何幫助。

更新: 好吧,所以我似乎在整個事情中發現了一個可能的錯誤。我正在使用oszilloscope來捕捉當我發送內容時出現在界面上的信號。我從單一的ASCII字符開始,看看最基本的信號是否合適。對於ascii'0',發送的信號是10000011001,ascii'1'是10100011001.所以這些差不多是我所期望的,除了似乎有2個起始位。通常我會期望只有1個startbit。有沒有辦法改變發送的startbits數量? 下面是Oszilloscope的輸出:

Signal of ASCII '0' Signal of ASCII '1'

來源

2016-07-06 Christoph Pohl

+0

正如RS485同時使用d +和D-作爲差分對半雙工的,即兩端部上的相同的兩條線上發送,但事實上,D-正在改變是絕對沒有跡象表明該傳感器發送,因爲當任一端傳輸D +和D-時都會有所不同。是RS485是半雙工的,但PC和傳感器之間的協議可能會涉及PC請求數據和傳感器響應然後關閉。雙方都知道協議併合作以確保不會發生衝突。很可能您的請求格式不正確或校驗和錯誤。你能驗證校驗和計算嗎? – barny

+0

爲了減少可能的錯誤來源,我會首先嚐試使用串行終端程序進行連接。手動發送命令字符串,看看是否有迴應。看起來像一個命令全部是ASCII格式,由\ r結尾(所以不用擔心排序,ralf)例如「0010074002 =?ccc \ r」其中ccc是十進制的校驗和,在LHS上以零填充爲三個字符。校驗和是它之前的所有字符值的簡單十進制加法,以256爲模,即000-255。對於0010074002 =?我做校驗和106,所以完整的命令應該是「0010074002 =?106 \ r」。是? – barny

+0

校驗和應該是正確的,因爲我使用了量表文檔中的示例請求。即使校驗和不正確,我相信儀表至少應該發回一個錯誤。我用了一個和你一樣的'0010074002 =?106 \ r'(你忘記了請求中數據的長度)。因此,如果我將使用Linux中的屏幕連接到串行端口,那麼發送此字符串到底需要做什麼?對不起,我從來沒有真正與這種事情合作 –



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3